// 解构赋值，引入gulp的功能
const {src, dest, watch, parallel} = require("gulp");
const concat = require("gulp-concat");
const rename = require("gulp-rename");
const uglify = require("gulp-uglify");
const babel = require("gulp-babel");
const connect = require('gulp-connect');
const { createProxyMiddleware } = require('http-proxy-middleware');
const sass = require('gulp-sass')(require('sass'));

// 拷贝文件功能
function copyFn(){
    // 找文件：入口文件夹名：src
    return src(["./src/*.{html,scss}"])      // 路径的多种表示方式
    // 转存文件：出口文件夹名：dist
    .pipe(dest("./dist"))
    // 拷贝之后，执行服务器插件的刷新功能
    .pipe(connect.reload())
}
// 暴露指令
exports.copy = copyFn;

// 拷贝公共类
function copyPublic() { 
    return src(["./src/public/*.html"])
    .pipe(dest("./dist/public"))
}
// 开启html,css监听功能
function watchPu(next){
    watch(["./src/public/*.html"], copyPublic);
    next();
}


// js文件合并，编译，压缩，改名功能
// function jsHandleFn(){
//     return src("./src/js/*.js")         // 找文件
//     .pipe(concat("all.js"))             // 合并
//     .pipe(babel({
//         presets: ['@babel/env']
//     }))                                 // ES6转ES5
//     .pipe(dest("./dist/js"))            // 转存
//     .pipe(uglify())                     // 压缩
//     .pipe(rename("all.min.js"))         // 改名
//     .pipe(dest("./dist/js"))            // 转存
//     .pipe(connect.reload())             // 刷新服务器
// }
function jsHandleFn(){
    return src("./src/js/*.js")         // 找文件
    .pipe(babel({
        presets: ['@babel/env']
    }))                                 // ES6转ES5
    .pipe(dest("./dist/js"))            // 转存
}
// 暴露指令
exports.jh = jsHandleFn;
// 开启js监听功能
function watchJsFn(next){
    watch(["./src/js/*.js"], jsHandleFn);
    next();
}



// 开启服务器功能
function serverFn(next){
    connect.server({
        root: "dist",
        port: 3000,
        livereload: true,
        // 给服务器插件添加第三方中间件
        // 跨域
        // middleware: function(connect, opt) {
        //     return [
        //         // 服务器代理的中间件
        //         createProxyMiddleware('/abc', {
        //             target:'https://news.baidu.com', //代理的目标地址
        //             changeOrigin:true,
        //             pathRewrite:{    //路径重写规则
        //                 '^/abc':''
        //             }
        //         })
        //     ]
        // }
    })
    next();
}
exports.server = serverFn;

// 开启html,css监听功能
function watchFn(next){
    watch(["./src/*.{html,scss}"], copyFn);
    next();
}
exports.watchFn = watchFn;
// 批处理：服务器和监听
exports.watchServer = parallel(serverFn, watchFn);


// 编译scss
function buildStyles() {
    return src('./src/sass/*.scss')
            .pipe(sass().on('error', sass.logError))
            .pipe(dest('./dist/css'))
            // 拷贝结束之后刷新服务器
            .pipe(connect.reload());
};
exports.bs = buildStyles;
// 开启监听sass
function watchSassFn() {
    return watch('./src/sass/*.scss', buildStyles);
};
// exports.watchFn = watchSassFn; 
// // 批处理sass
// exports.watchServer = parallel(buildStyles, watchSassFn);

// // 批处理监听html和sass
// exports.watchHtmlSass = parallel(watchFn,buildStyles,watchSassFn)

// // 批处理挂载到服务器上监听html和sass,js
// exports.watchAllServer = parallel(serverFn, watchFn, buildStyles, watchSassFn, watchJsFn)

// 批处理监听公共类html和sass,js
exports.watchAll = parallel(watchPu, watchFn, buildStyles, watchSassFn, watchJsFn)


